package com.ylz.sjzx.sio.common.core.core.Interceptor;


/**
 * Created with IntelliJ IDEA.
 * <p>
 * 预设拦截器分类,在架构包里预设的拦截器,可以分为以下2类:<br>
 * <p>
 * 1. 类型为RESERVED的interceptor在项目运行期间必定会执行。
 * <p>
 * <p>
 * 两种类型的 interceptor 都可以通过继承和重写方法的方式改变该拦截器的行为,
 * {@link InterceptorChain}会识别子类,使用子类替代父类。
 * <p>
 * 注意:
 * 1.一个拦截器不能有多个子类,否则在项目启动期会抛出异常。<br>
 * 2.RESERVED列表下interceptor子类的执行顺序以父类的执行顺序为准,子类注解上的order属性并不会生效。<br>
 */
public enum InterceptorType {

    /**
     * 保留类型Interceptor
     */
    RESERVED(
            TestInterceptor.class
    );

    /**
     * IInterceptor列表
     */
    private Class<? extends IInterceptor>[] list;

    InterceptorType(Class<? extends IInterceptor>... list) {
        this.list = list;
    }

    public Class<? extends IInterceptor>[] getList() {
        return this.list;
    }

    public Class<? extends IInterceptor> get(Class<? extends IInterceptor> clazz) {

        for (Class<? extends IInterceptor> comparedClazz : this.getList()) {

            if (comparedClazz.isAssignableFrom(clazz)) {
                return comparedClazz;
            }
        }

        return null;
    }
}
